From: Evan Welsh Date: Mon, 10 Jul 2023 09:34:17 +0000 (-0700) Subject: components: Change component loading to be asynchronous X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~337^2~1^2~41 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=d9198317ae224b85c26d5cf7fa0ae89d61ad20e8;p=gnome-shell.git components: Change component loading to be asynchronous Some components use build time optional dependencies such as GNOME Bluetooth, so we need to import the components conditionally. Also rename to get rid of __init__.js file Part-of: --- diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml index e223ee128..ee4b7635e 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -127,7 +127,7 @@ ui/workspacesView.js ui/xdndHandler.js - ui/components/__init__.js + ui/components.js ui/components/autorunManager.js ui/components/automountManager.js ui/components/networkAgent.js diff --git a/js/ui/components.js b/js/ui/components.js new file mode 100644 index 000000000..06751a964 --- /dev/null +++ b/js/ui/components.js @@ -0,0 +1,62 @@ +/* exported ComponentManager */ +const Main = imports.ui.main; + +var ComponentManager = class { + constructor() { + this._allComponents = {}; + this._enabledComponents = []; + + Main.sessionMode.connect('updated', () => { + this._sessionModeUpdated().catch(logError); + }); + + this._sessionModeUpdated().catch(logError); + } + + async _sessionModeUpdated() { + let newEnabledComponents = Main.sessionMode.components; + + await Promise.allSettled([...newEnabledComponents + .filter(name => !this._enabledComponents.includes(name)) + .map(name => this._enableComponent(name))]); + + this._enabledComponents + .filter(name => !newEnabledComponents.includes(name)) + .forEach(name => this._disableComponent(name)); + + this._enabledComponents = newEnabledComponents; + } + + async _importComponent(name) { + // TODO: Import as module + let module = await imports.ui.components[name]; + return module.Component; + } + + async _ensureComponent(name) { + let component = this._allComponents[name]; + if (component) + return component; + + if (Main.sessionMode.isLocked) + return null; + + let constructor = await this._importComponent(name); + component = new constructor(); + this._allComponents[name] = component; + return component; + } + + async _enableComponent(name) { + let component = await this._ensureComponent(name); + if (component) + component.enable(); + } + + _disableComponent(name) { + let component = this._allComponents[name]; + if (component == null) + return; + component.disable(); + } +}; diff --git a/js/ui/components/__init__.js b/js/ui/components/__init__.js deleted file mode 100644 index 74300136b..000000000 --- a/js/ui/components/__init__.js +++ /dev/null @@ -1,58 +0,0 @@ -/* exported ComponentManager */ -const Main = imports.ui.main; - -var ComponentManager = class { - constructor() { - this._allComponents = {}; - this._enabledComponents = []; - - Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); - this._sessionUpdated(); - } - - _sessionUpdated() { - let newEnabledComponents = Main.sessionMode.components; - - newEnabledComponents - .filter(name => !this._enabledComponents.includes(name)) - .forEach(name => this._enableComponent(name)); - - this._enabledComponents - .filter(name => !newEnabledComponents.includes(name)) - .forEach(name => this._disableComponent(name)); - - this._enabledComponents = newEnabledComponents; - } - - _importComponent(name) { - let module = imports.ui.components[name]; - return module.Component; - } - - _ensureComponent(name) { - let component = this._allComponents[name]; - if (component) - return component; - - if (Main.sessionMode.isLocked) - return null; - - let constructor = this._importComponent(name); - component = new constructor(); - this._allComponents[name] = component; - return component; - } - - _enableComponent(name) { - let component = this._ensureComponent(name); - if (component) - component.enable(); - } - - _disableComponent(name) { - let component = this._allComponents[name]; - if (component == null) - return; - component.disable(); - } -};